#ifndef PKT_CODEC_H
#define PKT_CODEC_H

#include <stdint.h>
#include <stdbool.h>

typedef enum
{
    DECODE_STATE_SYNC,
    DECODE_STATE_HEADER,
    DECODE_STATE_BODY
} decode_state_t;

// 数据包结构，包含头部和可变长度数据
typedef struct
{
    uint16_t header;   // 数据包同步码，固定值0x55AA
    uint16_t len;      // 数据包总长度
    uint16_t crc;      // 校验和（累加计算，排除crc字段）
    uint16_t seq;      // 序列号
    uint16_t cmd;      // 命令
    uint16_t data_len; // 数据长度
    uint8_t data[];    // 可变长度数据
} pkt_t;

// 编解码库的上下文，用于管理多次编码状态
typedef struct
{
    uint16_t seq;         // 序列号计数器
    uint16_t total_len;   // 已编码的总长度
    uint16_t crc;         // 校验和
    uint8_t *buffer;      // 指向用户提供的缓冲区
    uint16_t buffer_size; // 缓冲区大小
} codec_ctx_t;

typedef struct
{
    decode_state_t state;    // 当前解码状态
    uint16_t bytes_received; // 已接收的字节数
    pkt_t *current_packet;   // 当前正在解析的数据包
    uint16_t expected_len;   // 期望的数据包长度
} decoder_ctx_t;

void pkt_encode_init(codec_ctx_t *ctx, uint8_t *buffer, uint16_t buffer_size);
bool pkt_encode(codec_ctx_t *ctx, uint16_t cmd,
                const uint8_t *input_data, uint16_t input_len, bool final_call);

void pkt_decode_init(decoder_ctx_t *decoder_ctx, pkt_t *pkt);
bool pkt_decode(decoder_ctx_t *decoder_ctx, uint8_t byte);

#endif // PKT_CODEC_H
